// 描述: 配置统一读取接口
//      整合文件配置，系统环境变量，配置中心参数
//      优先级别： 配置中心参数 > 系统环境变量 > 文件配置

package config

import (
	"github.com/astaxie/beego/config"
	log "github.com/sirupsen/logrus"
	pathutils "go-dingding/go-common/utils/path"
	"os"
	"path/filepath"
	"strconv"
)

var beegoConfig config.Configer

func init() {
	log.Info("begin load config")

	// 1. 加载本地配置
	loadLocalConfig()

	// 2. 加载统一配置中心配置
	//loadRemoteConfig()

	log.Info("end load config")
}

// 加载本地配置
func loadLocalConfig() {
	cfgPath := os.Getenv("default_cfg_path")
	if cfgPath == "" {
		dir, err := pathutils.CurrentDir()
		if err != nil {
			log.Error(err)
		} else {
			cfgPath = filepath.Join(dir, "conf/app.conf")
		}
	}

	var err error
	beegoConfig, err = config.NewConfig("ini", cfgPath)
	if err != nil {
		panic(err)
	}

	log.Infof("loaded local config from %s", cfgPath)
}

// 从配置中心加载配置
func loadRemoteConfig() {
	//TODO 加载统一配置中心配置
	log.Info("loaded remote config")
}

func GetString(key string) string {
	value := os.Getenv(key)
	if value != "" {
		return value
	}
	return beegoConfig.String(key)
}

func GetDefaultString(key string, defaultVal string) string {
	value := GetString(key)
	if value == "" {
		return defaultVal
	}
	return value
}

func GetInt(key string) (int, error) {
	value := os.Getenv(key)
	if value != "" {
		return strconv.Atoi(value)
	}
	return beegoConfig.Int(key)
}

func GetDefaultInt(key string, defaultVal int) int {
	value, err := GetInt(key)
	if err != nil {
		return defaultVal
	}
	return value
}

func GetBool(key string) (bool, error) {
	value := os.Getenv(key)
	if value != "" {
		return config.ParseBool(value)
	}
	return beegoConfig.Bool(key)
}

func GetDefaultBool(key string, defaultVal bool) bool {
	value, err := GetBool(key)
	if err != nil {
		return defaultVal
	}
	return value
}

func GetFloat(key string) (float64, error) {
	value := os.Getenv(key)
	if value != "" {
		return strconv.ParseFloat(value, 64)
	}
	return beegoConfig.Float(key)
}

func GetDefaultFloat(key string, defaultVal float64) float64 {
	value, err := GetFloat(key)
	if err != nil {
		return defaultVal
	}
	return value
}
